package com.scott.ch400.atguigu.ch031.stack;

import java.util.Scanner;

/**
 * @author 黄后林
 * @date 2022-08-14 08:39:11
 * @note 且行且珍惜
 */
public class ArrayStackDemo {

    public static void main(String[] args) {


        ArrayStack stack = new ArrayStack(4);
        String key="";
        boolean loop =true; //loop用来控制是否退出菜单
        Scanner scanner = new Scanner(System.in);
        while(loop){
            System.out.println("show:打印栈");
            System.out.println("exit:退出程序");
            System.out.println("push:添加数据到栈-入栈");
            System.out.println("pop:从栈顶取出元素-出栈");
            System.out.println("--------请输入你的选择--------");
            key =scanner.next();

            switch (key){
                case "show":
                    stack.printStack();
                    break;
                case "push":
                    System.out.println("请输入1个整数...");
                    int data = scanner.nextInt();
                    stack.push(data);
                    break;
                case "pop":
                    try {
                        int rs =stack.pop();
                        System.out.printf("出栈的数据是%d\n",rs);
                    }catch (Exception e){
                        System.out.println(e.getMessage());

                    }
                    break;
                case "exit":
                    scanner.close();
                    loop=false;
                    break;

            }

        }

        System.out.println("-------------Game Over-------------");


    }
}

// 定义1个ArrayStack 表示栈
class ArrayStack{

    private int maxSize; //栈的大小 最多可以放多少个元素
    private int[] stack; //栈中的数据存放在stack数组中、使用数组模拟栈

    //top表示栈顶，初始化为-1，表示没有数据
    //因为数组的下标从0开始 当top等于0的时候表示栈中有1个元素 top=1表示有2个元素
    private int top =-1;

    //初始化栈的大小
    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        stack = new int[10];
    }

    //栈满
    public boolean isFull(){
        if(top == maxSize-1){
            return true;
        }
        return false;
    }

    //栈空
    public boolean isEmpty(){
        if(top == -1){
            return true;
        }
        return false;
    }

    //入栈-push
    public void push(int data){
        if(isFull()){
            System.out.println("栈满...");
            return;
        }

        //入栈的关键代码
        top=top+1;
        stack[top]=data;

        System.out.println("入栈成功...");

    }

    //出栈-pop 将栈顶的数据返回、同时删除栈顶元素
    public int pop(){
        if(isEmpty()){
            // 不返回但抛出运行时异常 抛出异常的同时带有return的功能=结束方法的运行
            throw new RuntimeException("...栈空... ");
        }

        //出栈的关键代码

        //定义一个临时变量保存栈顶的值
        int data = stack[top];

        //栈顶指针往下移动1位
        top=top-1;

        return data;

    }

    //打印栈
    public void printStack(){
        if(isEmpty()){
            System.out.println("栈空... 没有数据...");
            return;
        }

        // 遍历时、需要从栈顶开始显示数据 直到栈底
        for(int index=top; index>=0;index--){
            System.out.printf("stack[%d]=%d \n",index,stack[index]);
        }
    }
}

